'use strict';

import { app, protocol, BrowserWindow, ipcMain } from 'electron';
import {
	createProtocol,
	installVueDevtools
} from 'vue-cli-plugin-electron-builder/lib';
import { dialog } from 'electron'
const isDevelopment = process.env.NODE_ENV !== 'production';

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win: BrowserWindow | null;

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
	{ scheme: 'app', privileges: { secure: true, standard: true } }
]);

function createWindow() {
	// Create the browser window.
	win = new BrowserWindow({
		width: 1366,
		height: 768,
		webPreferences: {
			webSecurity: false,
			nodeIntegration: true,
			webviewTag: true
		},
		icon: __dirname + '/src/assets/icon.png'
	});
	win.removeMenu();
	if (process.env.WEBPACK_DEV_SERVER_URL) {
		// Load the url of the dev server if in development mode
		win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string);
		if (!process.env.IS_TEST) win.webContents.openDevTools();
	} else {
		createProtocol('app');
		// Load the index.html when not in development
		win.loadURL('app://./index.html');
	}

	win.on('close', (e) => {
		e.preventDefault();
		if (win) {
			win.webContents.send('onExit');
		}
	})

	win.on('closed', () => {
		win = null;
		app.quit();
	});
	// 在主线程下，通过ipcMain对象监听渲染线程传过来的getPrinterList事件
	ipcMain.on('getPrinterList', () => {
		if (win) {
			// 主线程获取打印机列表
			const list = win.webContents.getPrinters();
			// 通过webContents发送事件到渲染线程，同时将打印机列表也传过去
			win.webContents.send('getPrinterList', list);
		}
	});
	ipcMain.on('confirmToExit', () => {
		win = null;
		app.exit();
	})
}

// Quit when all windows are closed.
app.on('window-all-closed', () => {
	// On macOS it is common for applications and their menu bar
	// to stay active until the user quits explicitly with Cmd + Q
	if (process.platform !== 'darwin') {
		app.quit();
	}
});

app.on('activate', () => {
	// On macOS it's common to re-create a window in the app when the
	// dock icon is clicked and there are no other windows open.
	if (win === null) {
		createWindow();
	}
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {
	if (isDevelopment && !process.env.IS_TEST) {
		// Install Vue Devtools
		try {
			await installVueDevtools();
		} catch (e) {
			console.error('Vue Devtools failed to install:', e.toString());
		}
	}
	createWindow();
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
	if (process.platform === 'win32') {
		process.on('message', data => {
			if (data === 'graceful-exit') {
				app.quit();
			}
		});
	} else {
		process.on('SIGTERM', () => {
			app.quit();
		});
	}
}
